import pymysql


class DBUtil:
    # 定义类属性
    conn = None

    # 封装一个创建数据库链接的方法 ，添加装饰器@classmethod 目的是为了调用方便
    # 添加cls.类属性，目的是为了让其它的方法进行调用，把这个连接对象返回，因为query_db()和uid_db()要调用这个数据库的连接对象conn
    @classmethod
    def __connect_db(cls):
        cls.conn = pymysql.connect(host="211.103.136.244", port=7061, user="student", password="iHRM_student_2022",
                                   database="ihrm", charset="utf8")
        return cls.conn

    # 封装一个关闭数据库链接的方法,把connect_db, close_db 这2个方法变成私有方法，
    # 添加__(),目的是为了不让调用方看到内部方法的实现（调用方不关心）
    @classmethod
    def __close_db(cls):
        cls.conn.close()

    # 封装一个读取数据库的方法
    @classmethod
    def query_db(cls, sql):
        result = None
        cursor = None
        try:
            # 1、创建数据库的链接
            cls.conn = cls.__connect_db()
            # 2 、获取游标
            cursor = cls.conn.cursor()
            # 3 执行sql，获取结果集，需要返回结果
            cursor.execute(sql)
            result = cursor.fetchone()
        except Exception as err:
            print("读取数据库报错:", err)
        finally:
            # 4 关闭游标
            cursor.close()
            # 5关闭数据库的链接
            cls.__close_db()
            return result

    # 封装一个增删改数据库的方法
    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            # 1、创建数据库的链接
            cls.conn = cls.__connect_db()
            # 2 、获取游标
            cursor = cls.conn.cursor()
            # 3 执行sql，打印影响数据库的行数
            cursor.execute(sql)
            print("影响数据库的行数=", cls.conn.affected_rows())
            # 4 事务的提交和回滚
            cls.conn.commit()
        except Exception as err:
            print("增删改数据库报错:", err)
            cls.conn.rollback()
        finally:
            # 5 关闭游标
            cursor.close()
            # 6关闭数据库的链接
            cls.__close_db()


if __name__ == '__main__':
    # 实例方法的调用
    # db = DBUtil()
    # db.uid_db()
    # db.query_db()
    # 类方法的调用
    query_sql = "select * from t_book;"
    print(DBUtil.query_db(query_sql))
    update_sql = "DELETE from t_book WHERE id =1;"
    DBUtil.uid_db(update_sql)
